//1) 读取文件 同步读取
//2) 读取完后增加 自执行函数(vm模式执行，隔绝作用域)，并且默认返回module.exports

// let a = require('./02.js')

//等价于
/*
let a = /!* 查看02.js→ *!/(function () {
  function sum() {
    console.log(b)
  }

  module.exports = sum;
  return module.exports
})();
*/


/*
但这样有个问题
上面我们在sum里console.log(b)

他会顺着作用域链往上找 这样每个模块其实就不是独立的了 这不是我们所期望的

故我们会使用vm.runInThisContext这样的沙箱调用
*/

const path = require('path');
const fs = require('fs');
const vm = require('vm');
function myRequire(filepath){
  let absPath = path.resolve(__dirname, filepath);

  let module = new Module(absPath);
  module.load();
  return module.exports;
}
function Module(id){
  this.id = id;
  this.exports = {};
}
Module._extensions = {};
Module.prototype.load = function () {
  let ext = path.extname(this.id);
  Module._extensions[ext](this);
};
let wrapper = ['(function(exports,module,require,__dirname,__filename){', '})'];
Module._extensions['.js'] = function (module) {
  let script = fs.readFileSync(module.id, 'utf8');
  let functStr = wrapper[0] + script + wrapper[1];
  let fn = vm.runInThisContext(functStr);
  fn.call(module.exports,module.exports,module,myRequire);
};

let r  = myRequire('./a.js');
console.log(r);
